#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 错误处理
die() {
    echo -e "${RED}[错误] $1${NC}" >&2
    read -p "按回车键退出..."
    exit 1
}

# 获取本机IP地址
get_local_ip() {
    ip -o -4 addr show | awk '{print $4}' | cut -d'/' -f1 | grep -v '127.0.0.1' | head -n1
}

# 精准系统检测
detect_system() {
    if [ -f /etc/synoinfo.conf ] && [ -d /var/packages ]; then
        echo "dsm"
        return
    fi

    if grep -q "ID=debian" /etc/os-release && ls /vol1* &>/dev/null; then
        echo "fnos"
        return
    fi

    if grep -q "ID=debian" /etc/os-release; then
        echo "debian"
        return
    fi

    if [ -f /etc/os-release ]; then
        echo "linux"
        return
    fi

    echo "unknown"
}

# 获取Docker目录
get_docker_dir() {
    local system_type=$1
    local dir=""

    case $system_type in
        "dsm")
            # 查找现有的 docker 目录，找到就用第一个
            dir=$(find /volume* -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            # 如果没找到，就使用默认路径 /volume1/docker
            [ -z "$dir" ] && dir="/volume1/docker"
            ;;
        "fnos")
            # 查找现有的 docker 目录，找到就用第一个
            dir=$(find /vol*/1000 -maxdepth 1 -type d -name "docker" 2>/dev/null | head -n1)
            # 如果没找到，就使用默认路径 /vol1/1000/docker
            [ -z "$dir" ] && dir="/vol1/1000/docker"
            ;;
        *)
            # 其他系统直接使用 /opt/docker
            dir="/opt/docker"
            ;;
    esac

    # 清理路径中的特殊字符
    dir=$(echo "$dir" | tr -d '\n\r')
    
    # 创建目录（如果不存在）
    mkdir -p "$dir" || die "无法创建目录 $dir"
    
    echo "$dir"
}

# 获取用户输入，带默认值
get_input_with_default() {
    local prompt="$1"
    local default_value="$2"
    local input
    
    read -p "$prompt (默认: $default_value): " input
    echo "${input:-$default_value}"
}

# 验证端口范围格式
validate_port_range() {
    local port_range=$1
    if [[ ! $port_range =~ ^[0-9]+-[0-9]+$ ]]; then
        die "端口范围格式错误，请使用 '起始端口-结束端口' 格式（如：23352-23380）"
    fi
    
    local start_port=$(echo $port_range | cut -d'-' -f1)
    local end_port=$(echo $port_range | cut -d'-' -f2)
    
    if [ $start_port -ge $end_port ]; then
        die "起始端口必须小于结束端口"
    fi
    
    if [ $start_port -lt 1024 ] || [ $end_port -gt 65535 ]; then
        die "端口范围必须在 1024-65535 之间"
    fi
}

# 安装FRPS
install_frps() {
    local frp_dir="$1"
    
    mkdir -p "$frp_dir" || die "无法创建FRP目录: $frp_dir"
    chmod 755 "$frp_dir" || echo -e "${YELLOW}[警告] 无法设置目录权限${NC}"
    
    # 获取用户配置输入
    echo -e "${YELLOW}[配置FRPS] 请输入以下信息 (可直接回车使用默认值)${NC}"

    local subdomain_host=$(get_input_with_default "服务端域名或IP" "nas.example.com")   
    local bind_port=$(get_input_with_default "FRP服务监控端口" "23350")
    local dashboard_port=$(get_input_with_default "WEB面板登陆端口" "23351")
    local dashboard_user=$(get_input_with_default "WEB面板用户名" "admin")
    local dashboard_pwd=$(get_input_with_default "WEB面板密码" "FRP-123321-ww")
    local vhost_http_port=$(get_input_with_default "HTTP代理端口" "7080")
    local vhost_https_port=$(get_input_with_default "HTTPS代理端口" "7081")
    local token=$(get_input_with_default "身份验证Token" "12345678")
    
    # 新增配置项
    local allow_ports=$(get_input_with_default "允许的端口范围（格式：起始-结束）" "23352-23380")
    validate_port_range "$allow_ports"
    local max_ports_per_client=$(get_input_with_default "单个客户端最大代理数（0表示无限制）" "1")

    # 验证必填项
    while [ -z "$subdomain_host" ]; do
        echo -e "${RED}[错误] 服务端不能为空${NC}"
        subdomain_host=$(get_input_with_default "服务端域名或IP (如: nas.example.com)" "")
    done

    # 创建frps.ini配置文件
    if [ ! -f "${frp_dir}/frps.yml" ]; then
        cat > "${frp_dir}/frps.yml" <<EOF
[common]
# 监听端口
bind_port = ${bind_port}
# 面板端口
dashboard_port = ${dashboard_port}
# 登录面板账号设置
dashboard_user = ${dashboard_user}
dashboard_pwd = ${dashboard_pwd}
# 设置http及https协议下代理端口
vhost_http_port = ${vhost_http_port}
vhost_https_port = ${vhost_https_port}
# 服务端域名
subdomain_host = ${subdomain_host}
# 身份验证
token = ${token}
# 允许的端口范围
allow_ports = ${allow_ports}
# 单个客户端最大代理数
max_ports_per_client = ${max_ports_per_client}
EOF
        echo -e "${GREEN}[信息] 已创建FRPS配置文件: ${frp_dir}/frps.yml${NC}"
    else
        echo -e "${YELLOW}[注意] 已存在FRPS配置文件: ${frp_dir}/frps.yml${NC}"
        read -p "是否要替换现有配置文件? [Y/n] " replace_config
        if [[ "$replace_config" =~ ^[Nn]$ ]]; then
            echo -e "${YELLOW}[信息] 保留原有配置文件${NC}"
        else
            cat > "${frp_dir}/frps.yml" <<EOF
[common]
# 监听端口
bind_port = ${bind_port}
# 面板端口
dashboard_port = ${dashboard_port}
# 登录面板账号设置
dashboard_user = ${dashboard_user}
dashboard_pwd = ${dashboard_pwd}
# 设置http及https协议下代理端口
vhost_http_port = ${vhost_http_port}
vhost_https_port = ${vhost_https_port}
# 服务端域名
subdomain_host = ${subdomain_host}
# 身份验证
token = ${token}
# 允许的端口范围
allow_ports = ${allow_ports}
# 单个客户端最大代理数
max_ports_per_client = ${max_ports_per_client}
EOF
            echo -e "${GREEN}[信息] 已替换FRPS配置文件${NC}"
            chmod 666 "${frp_dir}/frps.yml" || echo -e "${YELLOW}[警告] 无法设置文件权限${NC}"
        fi
    fi

    # 清理旧容器
    if docker ps -aq --filter "name=frps"; then
        echo -e "${YELLOW}[注意] 移除已存在的frps容器...${NC}"
        docker stop frps >/dev/null 2>&1
        docker rm frps >/dev/null 2>&1
    fi

    # 运行FRPS容器
    echo -e "${BLUE}[信息] 正在启动FRPS容器...${NC}"
    if ! docker run -d \
        --name frps \
        --restart=always \
        --network host \
        -v "${frp_dir}/frps.yml:/etc/frp/frps.toml" \
        snowdreamtech/frps; then
        docker logs frps 2>&1 | head -n 20
        die "启动FRPS容器失败，请检查上方日志"
    fi

    # 验证容器状态
    sleep 3
    if ! docker ps --filter "name=frps" --format "{{.Status}}" | grep -q "Up"; then
        docker logs frps 2>&1 | head -n 20
        die "容器frps启动后异常退出，请检查上方日志"
    fi

    local ip=$(get_local_ip)
    echo -e "\n${GREEN}========== FRPS 安装成功 ==========${NC}"
    echo -e "FRPS 服务端配置: ${GREEN}${frp_dir}/frps.yml${NC}"
    echo -e "FRPS WEB控制面板: ${GREEN}http://${ip}:${dashboard_port}${NC}"
    echo -e "WEB登录用户名: ${YELLOW}${dashboard_user}${NC}"
    echo -e "WEB登录密码: ${YELLOW}${dashboard_pwd}${NC}"
    echo -e "FRPS 服务监控端口: ${YELLOW}${bind_port}${NC}"
    echo -e "HTTP 代理端口: ${YELLOW}${vhost_http_port}${NC}"
    echo -e "HTTPS 代理端口: ${YELLOW}${vhost_https_port}${NC}"
    echo -e "允许的端口范围: ${YELLOW}${allow_ports}${NC}"
    echo -e "单个客户端最大代理数: ${YELLOW}${max_ports_per_client}${NC}"
    echo -e "服务端域名或IP: ${YELLOW}${subdomain_host}${NC}"
    echo -e "身份验证token: ${YELLOW}${token}${NC}"
    echo -e "查看FRPS日志: ${YELLOW}docker logs frps${NC}"
    echo -e "\n${YELLOW}请确保已正确配置防火墙/路由器转发监控端口和其它服务端口！${NC}"
}

# 主流程
main() {
    echo -e "${BLUE}=== FRPS 服务端安装脚本 ===${NC}"
    
    # 检查Docker
    if ! command -v docker &>/dev/null; then
        die "Docker未安装，请先安装Docker"
    fi
    echo -e "${GREEN}[成功] Docker已安装: $(docker --version | cut -d ',' -f 1)${NC}"

    # 检测系统并获取目录
    system_type=$(detect_system)
    case $system_type in
        "dsm") echo -e "${GREEN}[系统] 检测到群辉DSM${NC}" ;;
        "fnos") echo -e "${GREEN}[系统] 检测到FNOS${NC}" ;;
        "debian") echo -e "${YELLOW}[系统] 检测到Debian${NC}" ;;
        "linux") echo -e "${YELLOW}[系统] 检测到通用Linux${NC}" ;;
        *) echo -e "${YELLOW}[警告] 系统类型未知，使用默认配置${NC}" ;;
    esac

    dir=$(get_docker_dir "$system_type")
    frp_dir="${dir}/frp"
    echo -e "${BLUE}[目录] 使用容器目录: ${dir}${NC}"

    install_frps "$frp_dir"

    read -p "按回车键退出..."
}

main "$@"